package com.shujia.spark.sql

import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

object Demo3DataSourceAPI {
  def main(args: Array[String]): Unit = {
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("api")
      .config("spark.sql.shuffle.partitions", 1) //指定spark sql shuffle之后rdd的分区数
      .getOrCreate()

    /**
     * 1、csv
     *
     */

    // csv read
    val subjectDF: DataFrame = spark
      .read
      .format("csv") //指定读取数据的格式
      .option("sep", ",") //指定数据分隔符
      .schema("cid  STRING , cname STRING , sco DOUBLE") //指定表结构
      .load("data/subject.txt") //指定读取数据的路径

    //保存为一个csv格式的文件
    subjectDF
      .write
      .format("csv")
      .option("sep", "|")
      .mode(SaveMode.Overwrite)
      .save("data/subject_temp")


    /**
     * 2， json
     *
     */

    //读取一个json格式的数据
    val studentJsonDF: DataFrame = spark
      .read
      .format("json") //指定读取json格式，读取json格式不需要指定分隔符和字段，会自动解析
      .load("data/students.json")


    //统计性别的人数
    val genderNumDF: DataFrame = studentJsonDF
      .groupBy("gender") //分组
      .count() //count

    //保存为一个json格式的数据
    genderNumDF
      .write
      .format("json") //保存为json格式，不需要指定分隔符
      .mode(SaveMode.Overwrite) //覆盖
      .save("data/gender_num_json")


    /**
     * 3、parquet， 压缩的自带表结构的格式， 兼容hive
     * 压缩：用时间换空间，压缩和解压都需要消耗cpu的时间
     *
     */

    //保存一个parquet格式的数据
    studentJsonDF
      .write
      .format("parquet") //保存为parquet格式
      .mode(SaveMode.Overwrite)
      .save("data/student_parquet")


    //读取一个parquet格式的数据
    val studentParquetDF: DataFrame = spark
      .read
      .format("parquet")
      .load("data/student_parquet")

    studentParquetDF.show()

    /**
     * 4、jdbc
     *
     */

    val studentJDBCDF: DataFrame = spark.read
      .format("jdbc")
      .option("url", "jdbc:mysql://master:3306")
      .option("dbtable", "student.student")
      .option("user", "root")
      .option("password", "123456")
      .load()

    studentJDBCDF.show()

  }

}
